package com.naotebuk.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.naotebuk.entity.Cliente;

public class ClienteDAO {

	// public methods
	
	public static boolean save(Cliente cliente) {
		try {
			if (cliente.getIdCliente() == 0) {
				insert(cliente);
			} else update(cliente);
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public static boolean insert(Cliente cliente) throws SQLException {
		String sql = " INSERT INTO CLIENTE (" +
				" NOME," +
				" CPF, " +
				" DATADENASCIMENTO, " +
				" SEXO," +
				" TIPOLOGRADOURO," +
				" LOGRADOURO," +
				" NUMERO," +
				" COMPLEMENTO," +
				" BAIRRO," +
				" CIDADE," +
				" ESTADO," +
				" EMAIL )" +
				" VALUES (?,?,?,?,?,?,?,?,?,?,?,?) ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			run.update(
					conn, 
					sql, 
					cliente.getNome(),
					cliente.getCpf(),
					cliente.getDataDeNascimento(),
					cliente.getSexo(),
					cliente.getTipoLogradouro(),
					cliente.getLogradouro(),
					cliente.getNumero(),
					cliente.getComplemento(),
					cliente.getBairro(),
					cliente.getCidade(),
					cliente.getEstado(),
					cliente.getEmail()
			);
			return true;
		} catch(SQLException e) {
			e.printStackTrace();
			return false;
		}
		finally {
			conn.close();
		}
	}
	public static boolean update(Cliente cliente) throws SQLException {
		String sql = " UPDATE CLIENTE SET " +
				" NOME = ?," +
				" CPF = ?, " +
				" DATADENASCIMENTO = ?, " +
				" SEXO = ?," +
				" TIPOLOGRADOURO = ?," +
				" LOGRADOURO = ?," +
				" NUMERO = ?," +
				" COMPLEMENTO = ?," +
				" BAIRRO = ?," +
				" CIDADE = ?," +
				" ESTADO = ?," +
				" EMAIL = ?" +
				" WHERE IDCLIENTE = ? ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			run.update(
					conn, 
					sql, 
					cliente.getNome(),
					cliente.getCpf(),
					cliente.getDataDeNascimento(),
					cliente.getSexo(),
					cliente.getTipoLogradouro(),
					cliente.getLogradouro(),
					cliente.getNumero(),
					cliente.getComplemento(),
					cliente.getBairro(),
					cliente.getCidade(),
					cliente.getEstado(),
					cliente.getEmail(),
					cliente.getIdCliente()
			);
			return true;
		} finally {
			conn.close();
		}
	}
	
	public static boolean delete(Cliente cliente) throws SQLException {
		String sql = " DELETE FROM CLIENTE " +
					" WHERE IDCLIENTE = ? ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			run.update(
					conn, 
					sql, 
					cliente.getIdCliente()
			);
			return true;
		} finally {
			conn.close();
		}
	}

	public static List<Cliente> getClientes() throws SQLException {
		String sql = " SELECT * " + 
				 	 " FROM CLIENTE ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			ResultSetHandler<List<Cliente>> h = new BeanListHandler<Cliente>(Cliente.class);
			return run.query(conn, sql, h); 
		} finally {
			conn.close();
		}
	}
	
	public static Cliente getCliente(int idCliente) throws SQLException {
		String sql = " SELECT * " + 
				 	 " FROM CLIENTE " +
				 	 " WHERE IDCLIENTE = ? ";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			ResultSetHandler<Cliente> h = new BeanHandler<Cliente>(Cliente.class);
			return run.query(conn, sql, h, idCliente); 
		} finally {
			conn.close();
		}
	}

//	public static List<Cliente> getClientes(Cliente c) throws SQLException {
//		String sql = " SELECT * " + 
//				 	 " FROM CLIENTE C" +
//				 	 " WHERE 1 = 1 ";
//		if (!c.getCpf().equals("")) sql += "AND CPF = ?";
//		if (!c.getNome().equals("")) sql += "AND NOME LIKE ?";
//		Connection conn = null;
//		try {
//			conn = DaoFactory.getConnection();
//			QueryRunner run = new QueryRunner();
//			ResultSetHandler<List<Cliente>> h = new BeanListHandler<Cliente>(Cliente.class);
//			if (c.getCpf().equals("") &&  c.getNome().equals("")) {
//				return run.query(conn, sql, h); 
//			} else if (!c.getCpf().equals("") &&  c.getNome().equals("")) {
//				return run.query(conn, sql, h, c.getCpf()); 
//			} else if (c.getCpf().equals("") &&  !c.getNome().equals("")) {
//				return run.query(conn, sql, h, c.getNome() ); 
//			} else {
//				return run.query(conn, sql, h, c.getCpf(), c.getNome()); 
//			}
//		} finally {
//			conn.close();
//		}
//	}
	
	public static List<Cliente> getClientes(Cliente c) throws SQLException {
		String sql = " SELECT * " + 
				 	 " FROM CLIENTE C" +
				 	 " WHERE 1 = 1";
		if (!c.getCpf().equals("")) sql += " AND CPF = " + c.getCpf();
		if (!c.getNome().equals("")) sql += " AND upper(NOME) LIKE upper('%" + c.getNome() + "%')";
		Connection conn = null;
		try {
			conn = DaoFactory.getConnection();
			QueryRunner run = new QueryRunner();
			ResultSetHandler<List<Cliente>> h = new BeanListHandler<Cliente>(Cliente.class);
			return run.query(conn, sql, h); 
		} finally {
			conn.close();
		}
	}

	public static boolean cpfCadastrado(String cpf) {
		
		try {
			String sql = " SELECT * " + 
					" FROM CLIENTE C" +
					" WHERE CPF = ? ";
			Connection conn = null;
			try {
				conn = DaoFactory.getConnection();
				QueryRunner run = new QueryRunner();
				ResultSetHandler<List<Cliente>> h = new BeanListHandler<Cliente>(Cliente.class);
				
				return run.query(conn, sql, h, cpf).size() > 0; 
				
			} finally {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
	}

	public static Cliente buscaPorCpf(String cpf) {
		try {
			String sql = " SELECT * " + 
					" FROM CLIENTE C" +
					" WHERE CPF = ? ";
			Connection conn = null;
			try {
				conn = DaoFactory.getConnection();
				QueryRunner run = new QueryRunner();
				ResultSetHandler<Cliente> h = new  BeanHandler<Cliente>(Cliente.class);
				
				return run.query(conn, sql, h, cpf); 
				
			} finally {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

	public static List<Cliente> buscaPorCpfParecido(String nome) {
		try {
			String sql = " SELECT * " + 
					" FROM CLIENTE C" +
					" WHERE NOME LIKE ? ";
			Connection conn = null;
			try {
				conn = DaoFactory.getConnection();
				QueryRunner run = new QueryRunner();
				ResultSetHandler<List<Cliente>> h = new BeanListHandler<Cliente>(Cliente.class);
				
				return run.query(conn, sql, h, '%'+nome+'%'); 
				
			} finally {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
}
